/**
 * 
 */
package cl.duocap.refaxion.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import cl.duocap.refaxion.dto.PaqueteDTO;
import cl.duocap.refaxion.dto.RepuestoDTO;
import cl.duocap.refaxion.dto.ServicioDTO;


/**
 * @author rentonx
 *
 */
public class PaqueteDAO {

	/**
	 * 
	 */
	private Connection conexion;
	
	public List<PaqueteDTO> obtenerPaquetes(){
		
		List<PaqueteDTO> listaPaquetes = new ArrayList<PaqueteDTO>();
		ResultSet rset = null;
		
		try {
			
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaPaquetes()}");
			rset = cstmt.executeQuery();
			PaqueteDTO paquete =  null;
			
			while (rset.next()) {
				
				
				paquete = new PaqueteDTO();
				paquete.setIdPaqueteMantencion(rset.getInt("idPaqueteMantencion"));
				paquete.setNombrePaqueteMantencion(rset.getString("nombrePaqueteMantencion"));
				paquete.setFechaIngreso(rset.getString("fechaIngreso"));
				paquete.setFechaBaja(rset.getString("fechaBaja"));
				paquete.setPrecioNeto(rset.getInt("precioNeto"));
				paquete.setDescuento(rset.getInt("descuento"));
				paquete.setPrecioTotal(rset.getInt("precioTotal"));
				paquete.setEstado(rset.getInt("estado"));
			
				listaPaquetes.add(paquete);	
				
			}
			cstmt.close();
			
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error eliminar Paquete.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            
	        }catch (Exception ex){
	            
	        }
	        
	    }
	    return listaPaquetes;	
	}
	
	public int obtenerIdMaximoPaquetes(){
		
		
		ResultSet rset = null;
		PaqueteDTO idMax = new PaqueteDTO();
		
		try {
			
			CallableStatement cstmt = conexion.prepareCall("{ call paConIdMaximoPaquetes()}");
			rset = cstmt.executeQuery();
			while (rset.next()) {
			idMax.setIdPaqueteMantencion(rset.getInt("idMaximoPaquetes"));
			}
			cstmt.close();
			
			
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error obtener id maximo Paquete.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            
	        }catch (Exception ex){
	            
	        }
	        
	    }
	    return idMax.getIdPaqueteMantencion();	
	}
	
	public boolean eliminarPaquete(int idPaquete){

		try {
			
			
			CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEliminarPaquete(?)}");
			int i=1;
			cstmt.setInt(i++,idPaquete);
			cstmt.executeUpdate();
			cstmt.close();
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error eliminar Paquete.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	 return false;
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            return false;
	        }catch (Exception ex){
	            
	        }
	        
	    }	
		return true;
			
	}
	
	
	public boolean registrarPaqueteNuevo(PaqueteDTO paqueteNuevo){
		
		try {
			
		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsRefaxionRegistrarPaquete(?,?,?,?,?,?)}");
		
				int i = 1;
				cstmt.setInt(i++,paqueteNuevo.getIdPaqueteMantencion());
				cstmt.setString(i++,paqueteNuevo.getNombrePaqueteMantencion());
				cstmt.setString(i++,paqueteNuevo.getFechaIngreso());
				cstmt.setInt(i++,paqueteNuevo.getPrecioNeto());
				cstmt.setInt(i++,paqueteNuevo.getDescuento());
				cstmt.setInt(i++,paqueteNuevo.getPrecioTotal());
				
				cstmt.executeUpdate();
				cstmt.close();
				
				return true;
				
		
		
		 } catch (SQLException ex) {
             throw new RuntimeException("registrar Paquete nuevo.",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	public boolean registrarPaqueteNuevoServiciosSeleccionados(List<ServicioDTO> listaServiciosSelEnGrilla, int idPaqueteNuevo){
		
		try {		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsRefaxionRegistrarPaqueteServiciosSeleccionados(?,?)}");
		
				int i = 1;
			
				for (ServicioDTO s : listaServiciosSelEnGrilla) {
					i=1;
					cstmt.setInt(i++,idPaqueteNuevo);
					cstmt.setInt(i++,s.getIdServicio());
					
					cstmt.executeUpdate();
					
				}
				cstmt.close();
				return true;

		 } catch (SQLException ex) {
			 throw new RuntimeException("registrar Paquete Nuevo (lista de Servicios).",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	public boolean registrarPaqueteNuevoRepuestosSeleccionados(List<RepuestoDTO> listaRepuestosSelEnGrilla, int idPaqueteNuevo){
		
		try {		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsRefaxionRegistrarPaqueteRepuestosSeleccionados(?,?)}");
		
				int i = 1;
			
				for (RepuestoDTO r : listaRepuestosSelEnGrilla) {
					i = 1;
					cstmt.setInt(i++,idPaqueteNuevo);
					cstmt.setInt(i++,r.getIdRepuesto());
					
					cstmt.executeUpdate();
					
				}
				cstmt.close();
				return true;

		 } catch (SQLException ex) {
             throw new RuntimeException("registrar Paquete Nuevo (lista de Repuestos).",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	
	public PaqueteDTO traerPaqueteEditar(int idPaquete) {

		
		   ResultSet rset = null;
		   PaqueteDTO paqueteEditar = new PaqueteDTO();
		   
			try {
					
					
					CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionTraerPaqueteEditar(?)}");
					
					int i = 1;
					cstmt.setInt(i++,idPaquete);
					rset = cstmt.executeQuery();

					while (rset.next()) {
						
						paqueteEditar = new PaqueteDTO();
						paqueteEditar.setIdPaqueteMantencion(rset.getInt("idPaqueteMantencion"));
						paqueteEditar.setNombrePaqueteMantencion(rset.getString("nombrePaqueteMantencion"));
						paqueteEditar.setFechaIngreso(rset.getString("fechaIngreso"));
						paqueteEditar.setFechaBaja(rset.getString("fechaBaja"));
						paqueteEditar.setPrecioNeto(rset.getInt("precioNeto"));
						paqueteEditar.setDescuento(rset.getInt("descuento"));
						paqueteEditar.setPrecioTotal(rset.getInt("precioTotal"));
						paqueteEditar.setEstado(rset.getInt("estado"));

					}
					cstmt.close();

					
			   } catch (SQLException ex) {
				   
			        throw new RuntimeException("DAO PAQUETE: error traer paque a editar.",ex);   
			        
				   }finally {
					   
				        try{
				       	 	  conexion.close();
				       	 
				           }catch (Exception ex){
				           
				           }
				           try{
				        		conexion.close();
				           
				        	   }catch (Exception ex){      
				        	   }
			       
				   	}

					 SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
					 String strFecha = paqueteEditar.getFechaIngreso();
					 Date fecha = null;
					 try {
		
					     fecha = formatoDelTexto.parse(strFecha);
		
					 } catch (ParseException ex) {
		
					     ex.printStackTrace();
		
					 }
			
					 paqueteEditar.setFechaIngresoTrans(fecha);

			return paqueteEditar;
		
	
	}
	
	public List<ServicioDTO> traeServiciosrPaqueteEditar (int idPaquete){
		
		List<ServicioDTO> listaServiciosEditar = new ArrayList<ServicioDTO>();
		ResultSet rset = null;
		
		try {
			
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaServicioPaqueteEditar(?)}");
			int i = 1;
			cstmt.setInt(i++,idPaquete);
			rset = cstmt.executeQuery();
			ServicioDTO servicio =  null;
			
			while (rset.next()) {
				
				
				servicio = new ServicioDTO();
				servicio.setIdServicio(rset.getInt("idServicio"));
				servicio.setServicioDescripcion(rset.getString("servicioDescripcion"));
				servicio.setPrecioListaServicio(rset.getInt("precioListaServicio"));


				listaServiciosEditar.add(servicio);	
				
			}
			cstmt.close();
			
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error listar servicios de paquete a editar.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            
	        }catch (Exception ex){
	            
	        }
	        
	    }
	    return listaServiciosEditar;	
		
	}
	
	public List<RepuestoDTO> traeRepuestosrPaqueteEditar (int idPaquete){
		
		List<RepuestoDTO> listaRepuestosEditar = new ArrayList<RepuestoDTO>();
		ResultSet rset = null;
		
		try {
			
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaRepuestoPaqueteEditar(?)}");
			int i = 1;
			cstmt.setInt(i++,idPaquete);
			rset = cstmt.executeQuery();
			RepuestoDTO repuesto =  null;
			
			while (rset.next()) {
				
				
				repuesto = new RepuestoDTO();
				repuesto.setIdRepuesto(rset.getInt("idRepuesto"));
				repuesto.setNombreRepuesto(rset.getString("nombreRepuesto"));
				repuesto.setDescripcion(rset.getString("descripcion"));
				repuesto.setPrecioRepuesto(rset.getInt("precioRepuesto"));


				listaRepuestosEditar.add(repuesto);	
				
			}
			cstmt.close();
			
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error listar repuesto de paquete a editar.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            
	        }catch (Exception ex){
	            
	        }
	        
	    }
	    return listaRepuestosEditar;	
		
	}
	
	public List<PaqueteDTO> obtenerPaquetesBuscados(int idPaquete, String nombrePaquete){
		
		List<PaqueteDTO> listaPaquetes = new ArrayList<PaqueteDTO>();
		ResultSet rset = null;
		
		try {
			
			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionListaPaquetesBuscados(?,?)}");
			int i = 1;
			cstmt.setInt(i++,idPaquete);
			cstmt.setString(i++,nombrePaquete);
			rset = cstmt.executeQuery();
			PaqueteDTO paquete =  null;
			
			while (rset.next()) {
				
				
				paquete = new PaqueteDTO();
				paquete.setIdPaqueteMantencion(rset.getInt("idPaqueteMantencion"));
				paquete.setNombrePaqueteMantencion(rset.getString("nombrePaqueteMantencion"));
				paquete.setFechaIngreso(rset.getString("fechaIngreso"));
				paquete.setFechaBaja(rset.getString("fechaBaja"));
				paquete.setPrecioNeto(rset.getInt("precioNeto"));
				paquete.setDescuento(rset.getInt("descuento"));
				paquete.setPrecioTotal(rset.getInt("precioTotal"));
				paquete.setEstado(rset.getInt("estado"));
			
				listaPaquetes.add(paquete);	
				
			}
			cstmt.close();
			
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error eliminar Paquete.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            
	        }catch (Exception ex){
	            
	        }
	        
	    }
	    return listaPaquetes;	
	}
	
	
	
	public PaqueteDAO() {
		
	}

	public Connection getConexion() {
		return conexion;
	}

	public void setConexion(Connection conexion) {
		this.conexion = conexion;
	}
	
	

}
